INTRODUÇÃO AO PYTHON

Autor

João Ricardo F. de Lima

Data de Publicação

1 de junho de 2024

Introdução


1Há duas principais maneiras de chegar a esse ambiente de programação:

  • Localmente: é preciso instalar o Python e uma IDE no seu computador.

  • Na nuvem: acessa pelo navegador um ambiente já pronto e configurado para rodar Python.

Um ambiente na nuvem pode ser o Jupyter Notebook/Google Colab e um ambiente local pode ser o VsCode ou Anaconda, mas a opção aqui é o Quarto do RStudio.


Jupyter Notebook/Google Colab

O Jupyter Notebook é uma interface para programar em uma estrutura de “caderno de anotação”: você pode escrever textos, inserir imagens, etc. e adicionar blocos de código, assim como exibir os resultados do código, tudo em um mesmo arquivo. Suas principais vantagens se referem a interface simples e intuitiva para iniciantes, além da facilidade de compartilhar códigos.

Para usar a interface do Jupyter na nuvem, basta seguir estes passos:

  1. Ter uma conta no Google;
  2. Acessar o Google Drive;
  3. Clicar em Novo (New) > Mais (More) > Google Colaboratory.

E com isso já se tem um ambiente de programação em Python.

O que estes procedimentos fazem é criar um arquivo “Untitled0.ipynb” no seu Google Drive. Dessa forma, você pode escolher onde criar o arquivo e organizar seus códigos em pastas, se preferir.

O ponto forte está na sua capacidade de fácil integração (Google Drive, Github, entre outros), além de não ser necessário ter instalado a linguagem na máquina.

Para acessar, basta ir no site https://colab.research.google.com/, ter uma conta Google e criar um novo notebook.

A outra possibilidade é ir no site do Python (https://www.python.org/), fazer download do arquivo e depois ir no terminal do Mac/OS ou no Prompt do Windows e instalar o Jupiter (python3 -m pip install jupyter). Depois de instalado, no termina/prompt é digitar python3 -m notebook para abrir um Jupyter no navegador e usar em uma interface muito parecida com a do Google Colab.


Quarto

O uso no Quarto se torna mais tranquilo para quem já usa o RStudio e trabalha tanto com o R quanto o Python. Para inserir os códigos a única diferença é que os chunks passam agora a iniciar com {python} ao invés de {r} depois das três crases.

E ainda existe a possibilidade de rodar Python dentro do R, desde que seja usado o pacote reticulate.

Um bom post sobre como preparar o ambiente de trabalho deve ser lido nesta página (https://analisemacro.com.br/data-science/python/introducao-ao-python-como-preparar-o-ambiente-de-trabalho/).

#install.packages("reticulate")
reticulate::py_config()
python:         /Library/Frameworks/Python.framework/Versions/3.12/bin/python3
libpython:      /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/config-3.12-darwin/libpython3.12.dylib
pythonhome:     /Library/Frameworks/Python.framework/Versions/3.12:/Library/Frameworks/Python.framework/Versions/3.12
version:        3.12.3 (v3.12.3:f6650f9ad7, Apr  9 2024, 08:18:48) [Clang 13.0.0 (clang-1300.0.29.30)]
numpy:          /Library/Frameworks/Python.framework/Versions/3.12/lib/python3.12/site-packages/numpy
numpy_version:  1.26.4

NOTE: Python version was forced by RETICULATE_PYTHON_FALLBACK
#py -m pip install jupyter
1 + 1
2


Instalações de Pacotes

#reticulate::py_install("pandas")
#!pip install python-bcb #Google Colab
#py -m pip install python-bcb #Terminal Windows
#python3 -m pip install python-bcb #Terminal Mac


Pacotes pandas e numpy

Pandas

  • É uma biblioteca para análise e tratamento de dados no Python.

  • Oferece uma sintaxe e estrutura de dados flexível.

  • Cobre (quase) tudo que você precisa para analisar dados.

  • É gratuito e de código aberto.

Saiba mais: https://pandas.pydata.org/

Numpy

  • É uma biblioteca para computação numérica no Python;

  • Oferece uma estrutura vetorial e matricial para dados numéricos;

  • É a base de muitas bibliotecas;

  • É gratuito e de código aberto.

Saiba mais: https://numpy.org/


Unboxing do pandas


Estrutura de dados tabulares

image/svg+xml column DataFrame row

Leitura e escrita de arquivos offline

image/svg+xml read_* to_* CSV XLS PARQUET HTML <> HDF5 JSON {} GBQ SQL ... CSV XLS PARQUET HTML <> HDF5 JSON {} GBQ SQL ...

Manipulação de dados facilitada

image/svg+xml

Módulo para visualização de dados

image/svg+xml .plot.* ...

Para fazer isso:

O ciclo de análise de dados…


Com o pandas, numpy e o Python, usa-se isso:

As principais bibliotecas usados para análise de dados.


Panda Series

import pandas as pd

series_obj = pd.Series([4,5,6,3])

series_obj
0    4
1    5
2    6
3    3
dtype: int64

sendo possível criar os valores dos índices

series_obj2 = pd.Series([4,7,8,-2], index = ['a', 'b', 'c', 'd'])
series_obj2
a    4
b    7
c    8
d   -2
dtype: int64
series_obj2.mean()
4.25
series_obj2 * 2
a     8
b    14
c    16
d    -4
dtype: int64
series_obj2['a']
4

Panda DataFrame

data_raw = {'cursos': ['machine learning', 'econometria', 'séries', 'visualização'],
            'carga horaria': [90, 60, 90, 40],
            'desconto': [True, False, True, False]}
            
data_raw
{'cursos': ['machine learning', 'econometria', 'séries', 'visualização'], 'carga horaria': [90, 60, 90, 40], 'desconto': [True, False, True, False]}

Importando Arquivos

Para importar um arquivo CSV offline pode-se usar a biblioteca pandas no Python:

# Importa o arquivo "dados.csv" salvo na pasta "dados" a partir da pasta atual
import pandas as pd
tabela = pd.read_csv(filepath_or_buffer = "dados/dados.csv")

A função read_csv() importa o arquivo para um objeto DataFrame no Python, basta apontar a localização.

Por padrão, a função tenta adivinhar os tipos das colunas e utiliza a primeira linha como nome das colunas da tabela.

tabela
           data     pib
0    1996-01-01   99.55
1    1996-04-01  100.44
2    1996-07-01  104.38
3    1996-10-01  103.30
4    1997-01-01  104.32
..          ...     ...
100  2021-01-01  171.54
101  2021-04-01  171.17
102  2021-07-01  171.28
103  2021-10-01  172.41
104  2022-01-01  174.13

[105 rows x 2 columns]
tabela.describe()
              pib
count  105.000000
mean   143.336762
std     26.246198
min     99.550000
25%    116.470000
50%    149.440000
75%    167.760000
max    177.060000
tabela.columns
Index(['data', 'pib'], dtype='object')
tabela.index
RangeIndex(start=0, stop=105, step=1)
tabela.head()
         data     pib
0  1996-01-01   99.55
1  1996-04-01  100.44
2  1996-07-01  104.38
3  1996-10-01  103.30
4  1997-01-01  104.32


Importando CSV com ponto e vírgula (;) de separador

O padrão de arquivos CSV é usar a vírgula como separador dos valores, mas em alguns casos o arquivo CSV pode ter sido gerado com um separador diferente.

No caso de separador ponto e vírgula (;) em um arquivo CSV, o padrão é que os decimais sejam, então, uma vírgula. Para importar nesse formato use os argumentos da função read_csv():

# Importa arquivo CSV com separador ;
tabela = pd.read_csv(filepath_or_buffer = "dados/dados_pv.csv", 
        sep = ";", decimal = ",")
tabela.head()
         data     pib
0  1996-01-01   99.55
1  1996-04-01  100.44
2  1996-07-01  104.38
3  1996-10-01  103.30
4  1997-01-01  104.32


Lidando com codificação de caracteres

O padrão do pacote pandas é utilizar a mesma codificação de caracteres de fábrica do Python, que é a UTF-8. Se o arquivo CSV foi gerado com outra codificação pode ser que a importação dos dados saia do resultado desejado. O principal problema que pode acontecer é caracteres especiais, como “ç”, não serem reconhecidos ou a importação gerar um erro. Por exemplo (dados do TSE):

# Importa arquivo CSV com separador ; e encoding padrão (gera um erro)
tse_codificacao_eua = pd.read_csv(
  filepath_or_buffer = "dados/tse.csv", 
  sep = ";"
  )
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xc7 in position 398: invalid continuation byte

Para lidar com esses problemas deve-se apontar uma codificação compatível com o arquivo no momento da importação. Basta informar no argumento encoding qual é a codificação correta:

# Importa arquivo CSV com separador ; e encoding latin1
tse_codificacao_br = pd.read_csv(
  filepath_or_buffer = "dados/tse.csv",
  sep = ";",
  encoding = "latin_1"
  )
tse_codificacao_br.iloc[range(3), range(6)]
   DT_GERACAO HH_GERACAO  ...    NM_TIPO_ELEICAO  NR_TURNO
0  01/11/2022   16:05:25  ...  ELEIÇÃO ORDINÁRIA         1
1  01/11/2022   16:05:25  ...  ELEIÇÃO ORDINÁRIA         1
2  01/11/2022   16:05:25  ...  ELEIÇÃO ORDINÁRIA         1

[3 rows x 6 columns]


Importando Excel

Para importar um arquivo Excel offline também pode usar a biblioteca pandas no Python:

import pandas as pd
tabela_excel = pd.read_excel(io = "dados/dados.xlsx")
tabela_excel
          data     pib
0   1996-01-01   99.55
1   1996-04-01  100.44
2   1996-07-01  104.38
3   1996-10-01  103.30
4   1997-01-01  104.32
..         ...     ...
100 2021-01-01  171.54
101 2021-04-01  171.17
102 2021-07-01  171.28
103 2021-10-01  172.41
104 2022-01-01  174.13

[105 rows x 2 columns]


Importando determinada Planilha do arquivo Excel

Para importar uma sheet específica do arquivo Excel no Python basta apontar o nome ou um int com sua posição (índice começa no 0):

tabela_ibcbr1 = pd.read_excel(
  io = "dados/dados.xlsx", 
  sheet_name = "ibc_br"
  )
tabela_ibcbr1
          data  ibc_br
0   2003-01-01   96.15
1   2003-02-01   98.67
2   2003-03-01  103.41
3   2003-04-01  102.19
4   2003-05-01  100.30
..         ...     ...
233 2022-06-01  142.13
234 2022-07-01  149.62
235 2022-08-01  150.09
236 2022-09-01  145.26
237 2022-10-01  143.56

[238 rows x 2 columns]
tabela_ibcbr2 = pd.read_excel(
  io = "dados/dados.xlsx", 
  sheet_name = 1
)
tabela_ibcbr2
          data  ibc_br
0   2003-01-01   96.15
1   2003-02-01   98.67
2   2003-03-01  103.41
3   2003-04-01  102.19
4   2003-05-01  100.30
..         ...     ...
233 2022-06-01  142.13
234 2022-07-01  149.62
235 2022-08-01  150.09
236 2022-09-01  145.26
237 2022-10-01  143.56

[238 rows x 2 columns]


Importação de Dados de Bases Brasileiras

  • Dados do BCB - utilizando a biblioteca python-bcb
  • Dados do IPEADATA - utilizando a biblioteca ipeadatapy
  • Dados do Sidra/IBGE - - utilizando a biblioteca sidrapy


Com uma série no Banco Central:

# Coletar dados da SELIC no SGS/BCB
from bcb import sgs # nome da biblioteca é "bcb"
import seaborn as sns # para fazer o gráfio

dados_sgs = sgs.get(codes = 432, start = "2020-01-01")
dados_sgs
             432
Date            
2020-01-01   4.5
2020-01-02   4.5
2020-01-03   4.5
2020-01-04   4.5
2020-01-05   4.5
...          ...
2024-05-28  10.5
2024-05-29  10.5
2024-05-30  10.5
2024-05-31  10.5
2024-06-01  10.5

[1614 rows x 1 columns]

#Gráfico da Série
sns.set_theme()
dados_sgs.plot(figsize=(15,10))


Com múltiplas séries:

dados_sgs = sgs.get(
  codes = {"Dólar": 3698, "IBC-Br": 24363, "Resultado Primário": 5793},
  start = "2020-01-01"
)
dados_sgs.tail()
             Dólar  IBC-Br  Resultado Primário
Date                                          
2023-12-01  4.8972  144.02                2.29
2024-01-01  4.9144  140.43                2.25
2024-02-01  4.9644  144.40                2.44
2024-03-01  4.9801  154.92                2.29
2024-04-01  5.1291     NaN                2.40


Para coletar os dados do Sistema de Expectativas:


# Coleta de dados de Expectativas de Mercado para Câmbio - final do ano

import pandas as pd

dados_focus = pd.read_csv(
        filepath_or_buffer = "https://olinda.bcb.gov.br/olinda/servico/Expectativas/versao/v1/odata/ExpectativasMercadoAnuais?$top=100&$filter=Indicador%20eq%20'C%C3%A2mbio'%20and%20Data%20ge%20'2024-01-01'%20and%20DataReferencia%20eq%20'2024'%20and%20baseCalculo%20gt%200&$format=text/csv&$select=Indicador,Data,DataReferencia,Media,baseCalculo",
    decimal = ",",
    sep = ",",
    encoding = "utf-8"
)

#Tipos de Encondings
#encoding=’latin1′
#encoding=’ISO-8859-1′
#encoding=’utf-8′
#encoding=’cp1252′

dados_focus.tail()
   Indicador        Data  DataReferencia   Media  baseCalculo
95    Câmbio  2024-05-20            2024  5.0421            1
96    Câmbio  2024-05-21            2024  5.0448            1
97    Câmbio  2024-05-22            2024  5.0510            1
98    Câmbio  2024-05-23            2024  5.0546            1
99    Câmbio  2024-05-24            2024  5.0579            1

Contudo, existe uma forma mais simples para fazer, demonstrada abaixo:

from bcb import Expectativas
expec = Expectativas()
expec.describe()
EntitySets:
  ExpectativasMercadoTop5Anuais
  ExpectativaMercadoMensais
  ExpectativasMercadoInflacao24Meses
  ExpectativasMercadoInflacao12Meses
  ExpectativasMercadoSelic
  ExpectativasMercadoTop5Selic
  ExpectativasMercadoTop5Mensais
  ExpectativasMercadoTrimestrais
  ExpectativasMercadoAnuais
expec.describe('ExpectativasMercadoAnuais')

EntitySet (Endpoint): ExpectativasMercadoAnuais
EntityType: br.gov.bcb.olinda.servico.Expectativas.ExpectativaMercadoAnual
Properties: Indicador<str>, IndicadorDetalhe<str>, Data<str>, DataReferencia<str>, Media<float>, Mediana<float>, DesvioPadrao<float>, Minimo<float>, Maximo<float>, numeroRespondentes<int>, baseCalculo<int>
ep = expec.get_endpoint('ExpectativasMercadoAnuais')

#Realizando o Filtro
(ep.query()
 .filter(ep.Indicador == 'Câmbio', ep.DataReferencia == 2024)
 .filter(ep.Data >= '2022-01-01')
 .filter(ep.baseCalculo == 1)
 .select(ep.Data, ep.Media, ep.Mediana)
 .orderby(ep.Data.desc())
 .limit(10)
 .collect())
        Data   Media  Mediana
0 2024-05-24  5.0579   5.0500
1 2024-05-23  5.0546   5.0500
2 2024-05-22  5.0510   5.0483
3 2024-05-21  5.0448   5.0413
4 2024-05-20  5.0421   5.0439
5 2024-05-17  5.0342   5.0243
6 2024-05-16  5.0389   5.0100
7 2024-05-15  5.0330   5.0051
8 2024-05-14  5.0385   5.0051
9 2024-05-13  5.0528   5.0500

Em relação aos dados do IPEADATA, suponha que o objetivo seja coletar a série do saldo do Novo CAGED.

  • Passo 1: utilize a função list_series() para localizar a série desejada e obter o código da mesma (retorna um DataFrame);
# Extrair tabela com todas séries e códigos disponíveis
import ipeadatapy as ipea
import matplotlib.pyplot as plt
import seaborn as sns

#Maneira usando Metadados
ipea.metadata()
                      CODE  ... NUMERICA
0             ABATE_ABPEAV  ...     True
1             ABATE_ABPEBV  ...     True
2             ABATE_ABPESU  ...     True
3             ABATE_ABQUAV  ...     True
4             ABATE_ABQUBV  ...     True
...                    ...  ...      ...
9885  PNADCT_TXPARTCUF_EMC  ...     True
9886  PNADCT_TXPARTCUF_EMI  ...     True
9887  PNADCT_TXPARTCUF_ESC  ...     True
9888  PNADCT_TXPARTCUF_ESI  ...     True
9889   PNADCT_TXPARTCUF_SI  ...     True

[9890 rows x 15 columns]
ipea.metadata(big_theme = 'Macroeconômico', frequency = 'Mensal', 
                      country = 'BRA', source = 'BM&FBovespa')
                    CODE  ... NUMERICA
7972   BMF12_SWAPDI18012  ...     True
7973  BMF12_SWAPDI180F12  ...     True
7974   BMF12_SWAPDI36012  ...     True
7975  BMF12_SWAPDI360F12  ...     True

[4 rows x 15 columns]
# Outra forma
series_ipeadata = ipea.list_series()

ipea.list_series('Caged')
                      CODE                                              NAME
6906               ADMISNC               Empregados - admissões - Novo Caged
6908      CAGED12_ADMISN12  Empregados - admissões - sem ajuste - novo Caged
6909   CAGED12_ADMISNAJU12  Empregados - admissões - com ajuste - novo Caged
6911     CAGED12_DESLIGN12  Empregados - demissões - sem ajuste - novo Caged
6912  CAGED12_DESLIGNAJU12  Empregados - demissões - com ajuste - novo Caged
6914      CAGED12_SALDON12      Empregados - saldo - sem ajuste - novo Caged
6915   CAGED12_SALDONAJU12      Empregados - saldo - com ajuste - novo Caged
6921              DESLIGNC               Empregados - demissões - Novo Caged
# Filtrar séries com o termo "CAGED"
series_ipeadata[series_ipeadata.CODE.str.contains("CAGED")]
                      CODE                                              NAME
6907         CAGED12_ADMIS                  Empregados - admissões - INATIVA
6908      CAGED12_ADMISN12  Empregados - admissões - sem ajuste - novo Caged
6909   CAGED12_ADMISNAJU12  Empregados - admissões - com ajuste - novo Caged
6910        CAGED12_DESLIG                  Empregados - demissões - INATIVA
6911     CAGED12_DESLIGN12  Empregados - demissões - sem ajuste - novo Caged
6912  CAGED12_DESLIGNAJU12  Empregados - demissões - com ajuste - novo Caged
6913       CAGED12_SALDO12                      Empregados - saldo - INATIVA
6914      CAGED12_SALDON12      Empregados - saldo - sem ajuste - novo Caged
6915   CAGED12_SALDONAJU12      Empregados - saldo - com ajuste - novo Caged
ipea.describe('CAGED12_SALDON12')
                     Empregados - saldo - sem ajuste - novo Caged
Name                 Empregados - saldo - sem ajuste - novo Caged
Code                                             CAGED12_SALDON12
Big Theme                                          Macroeconômico
Theme code                                                     12
Source          Ministério da Economia, Secretaria Especial de...
Source acronym                     Min. Economia/SEPRT/Novo Caged
Comment         Para empregados consideram-se aqueles contrata...
Last update                         2024-05-29T17:28:01.243-03:00
Frequency                                                  Mensal
Measure                                                    Pessoa
Unit                                                         None
Status                                                          A
  • Passo 2: aponte na função timeseries() o código da séries de interesse:
dados_ipeadata = ipea.timeseries(series = "CAGED12_SALDON12")
dados_ipeadata.head()
                        CODE                   RAW DATE  ...  YEAR  VALUE (Pessoa)
DATE                                                     ...                      
2020-01-01  CAGED12_SALDON12  2020-01-01T00:00:00-03:00  ...  2020         92678.0
2020-02-01  CAGED12_SALDON12  2020-02-01T00:00:00-03:00  ...  2020        198368.0
2020-03-01  CAGED12_SALDON12  2020-03-01T00:00:00-03:00  ...  2020       -232316.0
2020-04-01  CAGED12_SALDON12  2020-04-01T00:00:00-03:00  ...  2020       -902317.0
2020-05-01  CAGED12_SALDON12  2020-05-01T00:00:00-03:00  ...  2020       -352790.0

[5 rows x 6 columns]
dados_ipeadata.tail()
                        CODE                   RAW DATE  ...  YEAR  VALUE (Pessoa)
DATE                                                     ...                      
2023-12-01  CAGED12_SALDON12  2023-12-01T00:00:00-03:00  ...  2023       -430159.0
2024-01-01  CAGED12_SALDON12  2024-01-01T00:00:00-03:00  ...  2024        180395.0
2024-02-01  CAGED12_SALDON12  2024-02-01T00:00:00-03:00  ...  2024        306111.0
2024-03-01  CAGED12_SALDON12  2024-03-01T00:00:00-03:00  ...  2024        244315.0
2024-04-01  CAGED12_SALDON12  2024-04-01T00:00:00-03:00  ...  2024        240033.0

[5 rows x 6 columns]

#Gráficos
#dados_ipedata.plt.plot('RAW DATE', 'VALUE (Pessoa)'), kind = 'bar', figsize = (15,10))

Dessa forma simples se tem acesso rápido e fácil a diversas séries. Importante consultar os detalhes dos argumentos na documentação da biblioteca e, sobre as séries, pela função metadata() ou no site da instituição.

No caso dos dados do SIDRA, o mais fácil é consultar no SIDRA, obter o link e importar com o pandas.

A biblioteca oferece uma única função, get_table(), que permite, através de seus argumentos, específicar a série e seus parâmetros para a importação.

Os diferente tipos de parâmetros definem a tabela e suas dimensões (períodos, variáveis, unidades territorias e classificações/categorias). Iremos elencar a baixo cada parâmetro, como obter e onde se insere na função (para mais observações ver a página de ajuda da API do SIDRA).

  • t (table_code) - é o código da tabela referente ao indicador e a pesquisa;
  • p (period) - utilizado para específicar o período;
  • v (variable) - para específicar as variáveis desejadas;
  • n (territorial_level) - especifica os níveis territoriais;
  • n/ (ibge_territorial_code) - inserido dentro do nível terrorial, especificar o código territorial do IBGE;
  • c/ (classification/categories) - especifica as classificações da tabela e suas respectivas categorias.

Para obter a tabela e os códigos, o primeiro passo será entrar na interface do SIDRA e buscar a pesquisa/indicador de interesse através do site e em seu buscador https://sidra.ibge.gov.br/home/

  • Passo 1: localize no site https://sidra.ibge.gov.br/ a tabela de interesse e aplique os filtros desejados (neste caso marcamos “Variável” = “’Area Colhida”; “Produto das lavouras temporárias e permanentes” = “Manga”; “Ano” = 2003 a 2022 e “Unidade Territorial” = “Sao Francisco Pernambucano e Vale Sao Franciscano da Bahia”);
  • Passo 2: clique no botão de compartilhar, na parte inferior, chamado “Links de compartilhar” e no primeiro campo na tela que se abre, “Parâmetros para a API”, copie o link que aparece;
  • Passo 3: utilize a função read_json() do pandas para importar os dados, adicionando ao final do link esta opção “?formato=json”.

Dessa forma simples conseguimos acesso rápido e fácil aos dados de qualquer tabela do Sidra. Consulte os detalhes e mais opções na documentação das bibliotecas e, sobre as tabelas, no site da instituição.

# Importar tabela 5457 do Sidra/IBGE
import pandas as pd
dados_sidra = pd.read_json(
  path_or_buf = "https://apisidra.ibge.gov.br/values/t/5457/n8/2602,2902/v/216/p/last%2020/c782/0?formato=json"
  )
dados_sidra.tail()
   NC                      NN    MC        MN  ...   D3C   D3N D4C    D4N
36  8  Mesorregião Geográfica  1006  Hectares  ...  2018  2018   0  Total
37  8  Mesorregião Geográfica  1006  Hectares  ...  2019  2019   0  Total
38  8  Mesorregião Geográfica  1006  Hectares  ...  2020  2020   0  Total
39  8  Mesorregião Geográfica  1006  Hectares  ...  2021  2021   0  Total
40  8  Mesorregião Geográfica  1006  Hectares  ...  2022  2022   0  Total

[5 rows x 13 columns]

Outro Exemplo

Usada a série do PIB sem ajuste sazonal e com ajuste sazonal, referente a tabela 1620 e 1621, respectivamente, que se trata da série das Contas Nacionais Trimestrais.

  • t (table_code) = 1620
  • n (territorial_level) = 1
  • n/ (ibge_territorial_code) = all
  • v (variable) = all
  • p (period) = all
  • c/ (categories) = 11255/90707
# Importa as bibliotecas necessárias
import sidrapy
import numpy as np
import pandas as pd
import datetime as dt
import seaborn as sns
import matplotlib.pyplot as plt

# Importa os dados do SIDRA
pib_sa_raw = sidrapy.get_table(table_code= "1620",
                            territorial_level = "1",
                            ibge_territorial_code = "all",
                            period = "all",
                            classification = "11255/90707")

pib_sa_raw.head()
                           NC  ...                                                D4N
0  Nível Territorial (Código)  ...                                           Variável
1                           1  ...  Série encadeada do índice de volume trimestral...
2                           1  ...  Série encadeada do índice de volume trimestral...
3                           1  ...  Série encadeada do índice de volume trimestral...
4                           1  ...  Série encadeada do índice de volume trimestral...

[5 rows x 13 columns]
# Substitui as colunas pela primeira observação
pib_sa_raw.columns = pib_sa_raw.iloc[0]

# Retira a primeira observação
pib_sa_raw = pib_sa_raw.iloc[1:, :]

# Altera para float a coluna do valor
pib_sa_raw['Valor'] = pib_sa_raw['Valor'].astype(float)

pib_sa_raw.head()
0 Nível Territorial (Código)  ...                                           Variável
1                          1  ...  Série encadeada do índice de volume trimestral...
2                          1  ...  Série encadeada do índice de volume trimestral...
3                          1  ...  Série encadeada do índice de volume trimestral...
4                          1  ...  Série encadeada do índice de volume trimestral...
5                          1  ...  Série encadeada do índice de volume trimestral...

[5 rows x 13 columns]
# Renomeia e seleciona as colunas de interesse
pib_sa = pib_sa_raw.rename(columns = {"Valor" : "pib_sa",
                                "Trimestre (Código)" : "date"})[['pib_sa', 'date']]

pib_sa                                
0    pib_sa    date
1     96.84  199601
2    100.12  199602
3    107.56  199603
4    104.31  199604
5    100.13  199701
..      ...     ...
108  178.65  202204
109  180.35  202301
110  183.61  202302
111  186.63  202303
112  182.31  202304

[112 rows x 2 columns]
# Lidar com a coluna de trimestre para transformar em data
pib_sa['date'] = pib_sa['date'].str[:-2] + pib_sa['date'].str[-2:].replace({"01" : "03",
                                                                  "02" : "06",
                                                                  "03" : "09",

                                                                  "04" : "12"})
                                                                  
pib_sa
0    pib_sa    date
1     96.84  199603
2    100.12  199606
3    107.56  199609
4    104.31  199612
5    100.13  199703
..      ...     ...
108  178.65  202212
109  180.35  202303
110  183.61  202306
111  186.63  202309
112  182.31  202312

[112 rows x 2 columns]
# Transforma em formato date a coluna de data e insere no índice
pib_sa.index = pd.to_datetime(pib_sa['date'],
                              format = "%Y%m")
                              
# Retira a coluna de data
pib_sa = pib_sa.drop(columns = ['date'])

pib_sa
0           pib_sa
date              
1996-03-01   96.84
1996-06-01  100.12
1996-09-01  107.56
1996-12-01  104.31
1997-03-01  100.13
...            ...
2022-12-01  178.65
2023-03-01  180.35
2023-06-01  183.61
2023-09-01  186.63
2023-12-01  182.31

[112 rows x 1 columns]
# Importa os dados do pib com ajuste sazonal
pib_raw = sidrapy.get_table(table_code= "1621",
                            territorial_level = "1",
                            ibge_territorial_code= "all",
                            period = "all",
                            classification = "11255/90707")

pib_raw.head()
                           NC  ...                                                D4N
0  Nível Territorial (Código)  ...                                           Variável
1                           1  ...  Série encadeada do índice de volume trimestral...
2                           1  ...  Série encadeada do índice de volume trimestral...
3                           1  ...  Série encadeada do índice de volume trimestral...
4                           1  ...  Série encadeada do índice de volume trimestral...

[5 rows x 13 columns]
# Substitui as colunas pela primeira observação
pib_raw.columns = pib_raw.iloc[0]

# Retira a primeira observação
pib_raw = pib_raw.iloc[1:, :]

# Altera para float a coluna do valor
pib_raw['Valor'] = pib_raw['Valor'].astype(float)

# Renomeia e seleciona as colunas
pib = pib_raw.rename(columns = {"Valor" : "pib",
                                "Trimestre (Código)" : "date"})[['pib', 'date']]


# Procedimento para lidar com a coluna de trimestre para transformar em data
pib['date'] = pib['date'].str[:-2] + pib['date'].str[-2:].replace({"01" : "03",
                                                                  "02" : "06",
                                                                  "03" : "09",
                                                                  "04" : "12"})



# Transforma em formato date a coluna de data e insere no índice
pib.index = pd.to_datetime(pib['date'],
                           format = "%Y%m")

# Retira a coluna de data
pib = pib.drop(columns = ['date'])

pib
0              pib
date              
1996-03-01   99.42
1996-06-01  100.65
1996-09-01  104.16
1996-12-01  103.38
1997-03-01  104.41
...            ...
2022-12-01  179.97
2023-03-01  182.35
2023-06-01  183.88
2023-09-01  183.94
2023-12-01  183.88

[112 rows x 1 columns]
#Juntar as duas bases de dados para fazer o gráfico
pib_df = pd.merge(pib, pib_sa,
         left_index = True, 
         right_index = True)
         
pib_df
0              pib  pib_sa
date                      
1996-03-01   99.42   96.84
1996-06-01  100.65  100.12
1996-09-01  104.16  107.56
1996-12-01  103.38  104.31
1997-03-01  104.41  100.13
...            ...     ...
2022-12-01  179.97  178.65
2023-03-01  182.35  180.35
2023-06-01  183.88  183.61
2023-09-01  183.94  186.63
2023-12-01  183.88  182.31

[112 rows x 2 columns]
# Transforma o data frame de wide para long
pib_df_long = pd.melt(pib_df.reset_index(),
            id_vars = 'date',
            value_vars = ['pib', 'pib_sa'],
            var_name = 'variable',
            value_name = 'values')
# Configura o tema do gráfico
theme = {'figure.figsize' : (15, 10),
         'axes.facecolor' : 'white',
         "axes.spines.right": False,
         "axes.spines.top": False}

# Cor das variáveis
colors = ['#282f6b', '#b22200']

# Adiciona as configurações
sns.set_theme(style = 'white', 
              palette = colors,
              rc = theme)

# Plota
sns.lineplot(x = 'date', y = 'values', 
            data = pib_df_long,
            hue = 'variable',
            linewidth = 2).set(xlabel = "",
                               ylabel = "Número Índice",
                               title = "Produto Interno Bruto - Índice (Base 1995 = 100)")

 # Adiciona a fonte no gráfico           
plt.annotate('Fonte: Sidra/IBGE',
            xy = (1.0, -0.06),
            xycoords='axes fraction',
            ha='right',
            va="center",
            fontsize=10)

Introdução ao NumPy

O NumPy, abreviatura de Numerical Python, é a biblioteca básica mais importante para o uso da análise de dados com Python. Os recursos do uso desse pacote permitem ao usuário realizar operações matemáticas, manipulação de vetores e dados entre outras diversas funcionalidade. Abaixo são mostrados os pontos básicos mais importante do NumPy.

Entre os principais recursos que pode se encontrar com NumPy, estão:

  • ndarray: um vetor multidimensional, que oferece operações aritméticas rápidas;
  • funções matemáticas para operações com vetores;
  • alinhamento e manipulação de dados.

ndarray

o objeto ndarray é uma classe de objeto no Python que permite a utilização de conjunto de dados como um vetor ou um conjunto de vetores, ou seja, permite realizar operações matemáticas e estatísticas, bem como também é possível manejar os dados de forma mais facilitada.

Um exemplo de calculo que pode-se utilizar é multiplicar um número inteiro com um vetor de dados. Assim como na matemática, o valor escalar repete a operação em todos os valores do vetores (algo que não ocorre sem o NumPy sem definir uma operação de fluxo com for), isto é chamado de vetorização.

import numpy as np

data = np.random.randn(2, 3)

data
array([[ 0.18318658, -1.00812981, -1.09105231],
       [-1.39357809,  1.21490157,  0.4868883 ]])
data * 5
array([[ 0.91593292, -5.04064903, -5.45526156],
       [-6.96789043,  6.07450784,  2.43444149]])
data + data
array([[ 0.36637317, -2.01625961, -2.18210462],
       [-2.78715617,  2.42980314,  0.9737766 ]])
data.dtype
dtype('float64')

Para controlar o array, um modo simples de criar um vetor ordenado é utilizar arange. Para fatiar os valores, utiliza-se o colchete define o fatiamento conforme a coodernada do valor dentro do array.

arr1 =  np.array([1, 2, 3, 4, 5])

arr1
array([1, 2, 3, 4, 5])
np.arange(10)
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr1[1:3]
array([2, 3])
arr3d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])

arr3d
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

Para realizar cálculos estatístico, o próprio NumPy oferece meios de realizar os cálculos.

arr1.mean()
3.0
# Soma
arr1.sum()
15
# Desvio Padrão
arr1.std()
1.4142135623730951
# Mínimo
arr1.min()
1
# Máximo
arr1.max()
5

Notas de rodapé

  1. Todo este material foi retirado de diversas postagens e cursos da Análise Macro (www.analisemacro.com.br)↩︎